﻿/******************************************************************************
* File description: animationState_Shifting.cpp
* Function: 放靶和转靶动画State，用于记录当前动画的状态，并（只记录目标位置，中间过渡位置由Controller计算）
* Current Version: 1.0.0
* Author: JNN
* Date: 2025-07-01
*  -----
*  Copyright by 博坤生物 .
 *****************************************************************************/

#include "animationState_Shifting.h"

/** @brief 构造函数 */
AnimationState_Shifting::AnimationState_Shifting()
{

}


/** @brief 重置动画状态至机器复位状态 */
void AnimationState_Shifting::reset(){
    _barOperation.clear();

    _clampPosi = 0;
    _bafflePosi = 0;
    _peristalticPump = 0;
    _blowTargetState = 0;

    _capCraneState = 0;
    _targetCraneState = 0;
}


/** @brief 开盖器下移 */
void AnimationState_Shifting::step_capDown(){
    _barOperation.enqueue(DOWN_CAP);
}

/** @brief 开盖器上移 */
void AnimationState_Shifting::step_capUp(){
    _barOperation.enqueue(UP_CAP);
}

/** @brief 设置开盖夹爪状态-松开 */
void AnimationState_Shifting::step_openCapClamp(){
    _barOperation.enqueue(OPEN_CAP_CLAMP);
}

/** @brief 设置开盖夹爪状态-夹紧 */
void AnimationState_Shifting::step_closeCapClamp(){
    _barOperation.enqueue(CLOSE_CAP_CLAMP);
}


/** @brief 设置夹爪状态
 *  @param 0松开 1夹紧  */
void AnimationState_Shifting::setClampState(int state){
    _clampPosi = state;
}

/** @brief 设置挡板状态
 *  @param 0挡 1不挡  */
void AnimationState_Shifting::setBaffleState(int state){
    _bafflePosi = state;
}

/** @brief 开盖（动画会执行开盖操作序列） */
void AnimationState_Shifting::openCap(){
    _barOperation.enqueue(MOV_CAP);
    _barOperation.enqueue(DOWN_CAP);
    _barOperation.enqueue(CLOSE_CAP_CLAMP);
    _barOperation.enqueue(ROT_CAP_1_OPEN);
    _barOperation.enqueue(UP_CAP);
    _barOperation.enqueue(MOV_ORIGIN);
}

/** @brief 关盖（动画会执行关盖操作序列） */
void AnimationState_Shifting::closeCap(){
    _barOperation.enqueue(MOV_CAP);
    _barOperation.enqueue(DOWN_CAP);
    _barOperation.enqueue(ROT_CAP_0_CLOSE);
    _barOperation.enqueue(OPEN_CAP_CLAMP);
    _barOperation.enqueue(UP_CAP);
}

/** @brief 取靶（动画会执行取靶操作序列） */
void AnimationState_Shifting::takeTarget(){
    _barOperation.enqueue(MOV_TARGET1);
    if(_machineType == 2){
        _barOperation.enqueue(ROTATE_TARGET1);
    }
    _barOperation.enqueue(DOWN_TARGET);
    _barOperation.enqueue(UP_TARGET);
}

/** @brief 放靶（动画会执行放靶操作序列） */
void AnimationState_Shifting::placeTarget(){
    _barOperation.enqueue(MOV_TARGET2);
    if(_machineType == 2){
        _barOperation.enqueue(ROTATE_TARGET1);
    }
    _barOperation.enqueue(DOWN_TARGET);
    _barOperation.enqueue(UP_TARGET);
}

/** @brief 运动到活检那 */
void AnimationState_Shifting::moveToRadio(){
    step_move2radio();
    if(_machineType == 2){
        step_suckRotateLeft();
    }
    step_downTarget();          // 不知道要干啥操作，反正过去然后下去就好了
    step_upTarget();
}

/** @brief 中间的杆回到原点位置 */
void AnimationState_Shifting::resetBar(){
    _barOperation.enqueue(MOV_ORIGIN);
}

/** @brief 设置蠕动泵状态
 *  @param state -1抽液 0不动 1打液 */
void AnimationState_Shifting::setPPumpState(int state){
    _peristalticPump = state;
}

/** @brief 设置传靶吹气状态
 *  @param state -1故障 0不动 1吹气 */
void AnimationState_Shifting::setBlowTargetState(int state){
    _blowTargetState = state;
}

/** @brief 设置开盖器状态（好像只用设置故障状态，其它的在开盖/关盖函数调用）
 *  @param state -1故障 0在上面 1在下面 */
void AnimationState_Shifting::setTargetCraneState(int state){
    _targetCraneState = state;
}
/** @brief 设置活检位置
 *  @param state 0在上面 1在下面 */
void AnimationState_Shifting::setRadioBarState(int state){
    _radioBarPosi = state;
}

/** @brief 设置吸靶器状态（好像只用设置故障状态，其它的在吸靶/放靶函数调用）
 *  @param state -1故障 0在上面 1在下面 */
void AnimationState_Shifting::setCapCraneState(int state){
    _capCraneState = state;
}

/** @brief 中间那个东西移动到最左边 */
void AnimationState_Shifting::step_move2origin(){
    _barOperation.enqueue(MOV_ORIGIN);
}

/** @brief 开盖器移动到平台位置 */
void AnimationState_Shifting::step_move2cap(){
    _barOperation.enqueue(MOV_CAP);
}

/** @brief 吸盘移动到平台位置 */
void AnimationState_Shifting::step_move2target1(){
    _barOperation.enqueue(MOV_TARGET1);
}

/** @brief 吸盘移动到溶靶罐位置 */
void AnimationState_Shifting::step_move2target2(){
    _barOperation.enqueue(MOV_TARGET2);
}

/** @brief 吸盘移动到溶靶罐位置 */
void AnimationState_Shifting::step_move2radio(){
    _barOperation.enqueue(MOV_RADIO);
}

/** @brief 开盖动作（纯转） */
void AnimationState_Shifting::step_openCap(){
    _barOperation.enqueue(ROT_CAP_1_OPEN);
}

/** @brief 关盖动作（纯转） */
void AnimationState_Shifting::step_closeCap(){
    _barOperation.enqueue(ROT_CAP_0_CLOSE);
}

/** @brief 取靶动作（不加移动） */
void AnimationState_Shifting::step_takeTarget(){
    _barOperation.enqueue(DOWN_TARGET);
    _barOperation.enqueue(UP_TARGET);
}

/** @brief 放靶动作（不加移动） */
void AnimationState_Shifting::step_placeTarget(){
    _barOperation.enqueue(DOWN_TARGET);
    _barOperation.enqueue(UP_TARGET);
}

/** @brief 取放靶-上去 */
void AnimationState_Shifting::step_upTarget(){
    _barOperation.enqueue(UP_TARGET);
}
/** @brief 取放靶-下来 */
void AnimationState_Shifting::step_downTarget(){
    _barOperation.enqueue(DOWN_TARGET);
}

/** @brief 转圈 */
void AnimationState_Shifting::step_suckRotateLeft(){
    _barOperation.enqueue(ROTATE_RADIO);
}
void AnimationState_Shifting::step_suckRotateRight(){
    _barOperation.enqueue(ROTATE_TARGET1);
}
